/*
授权声明：
本源码系《Java多线程编程实战指南（核心篇）》一书（ISBN：978-7-121-31065-2，以下称之为“原书”）的配套源码，
欲了解本代码的更多细节，请参考原书。
本代码仅为原书的配套说明之用，并不附带任何承诺（如质量保证和收益）。
以任何形式将本代码之部分或者全部用于营利性用途需经版权人书面同意。
将本代码之部分或者全部用于非营利性用途需要在代码中保留本声明。
任何对本代码的修改需在代码中以注释的形式注明修改人、修改时间以及修改内容。
本代码可以从以下网址下载：
https://github.com/Viscent/javamtia
http://www.broadview.com.cn/31065
*/
package io.github.viscent.mtia.ch5;

import java.util.HashSet;
import java.util.Set;

/**
 * 线程终止登记表
 *
 * @author Viscent Huang
 */
public enum ThreadTerminationRegistry {
  INSTANCE;

  private final Set<Handler> handlers = new HashSet<Handler>();

  public synchronized void register(Handler handler) {
    handlers.add(handler);
  }

  public void clearThreads() {
    // 为保障线程安全，在遍历时将handlers复制一份
    final Set<Handler> handlersSnapshot;
    synchronized (this) {
      handlersSnapshot = new HashSet<Handler>(handlers);
    }

    for (Handler handler : handlersSnapshot) {
      try {
        handler.terminate();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 线程终止处理器
   * <p>
   * 封装了有关线程停止的知识
   *
   * @author Viscent Huang
   */
  public static interface Handler {
    void terminate();
  }
}
